/*
 * 文 件 名:  DatabaseServer.java
 * 版    权:  Huawei Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved
 * 描    述:  <描述>
 * 修 改 人:  admin
 * 修改时间:  2013-6-22
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package org.gfz.frame.core.database;

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;

import org.gfz.frame.core.common.BaseTools;

/**
 * <一句话功能简述>数据库连接服务 <功能详细描述>
 * 
 * @author 姓名 工号
 * @version [版本号, 2013-6-22]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class DatabaseServer
{
    /**
     * <一句话功能简述>数据库类型 <功能详细描述>
     * 
     * @author 姓名 工号
     * @version [版本号, 2013-6-22]
     * @see [相关类/方法]
     * @since [产品/模块版本]
     */
    public static enum DbType
    {
        // oracle
        ORACLE,
        // sybase
        SYBASE,
        // sqlserver
        MSSQL
    }
    
    /**
     * 连接池引用
     */
    protected ConnectionPool pool;
    
    /**
     * 连接超时时间
     */
    protected static final int DEFAULT_LOGIN_TIME = 30;
    
    /**
     * 参数key
     */
    protected static final String USER_KEY = "user";
    
    /**
     * 参数key
     */
    protected static final String PWD_KEY = "password";
    
    /**
     * oracle url header
     */
    private static final String ORACLE_URL_HEADER = "jdbc:oracle:thin:@";
    
    /**
     * sqlserver url header
     */
    private static final String MSSQL_URL_HEADER = "jdbc:sqlserver://";
    
    /**
     * sybase url header
     */
    private static final String SYBASE_URL_HEADER = "jdbc:sybase:Tds:";
    
    /**
     * <默认构造函数>
     */
    protected DatabaseServer()
    {
        this.pool = ConnectionPool.getInstance();
    }
    
    /**
     * <一句话功能简述>获取数据库连接 <功能详细描述>
     * 
     * @param dbName 库名
     * @param ip ip地址
     * @param port 端口号
     * @param useName 用户名
     * @param pwd 密码
     * @return Connection 连接对象
     * @throws SQLException
     * @see [类、类#方法、类#成员]
     */
    public abstract Connection getDBConnection(String dbName, String ip, int port, String useName, String pwd)
        throws SQLException;
    
    /**
     * <一句话功能简述>根据数据库类型获取数据库服务 <功能详细描述>
     * 
     * @param dbType 数据库类型
     * @return DatabaseServer
     * @see [类、类#方法、类#成员]
     */
    public static DatabaseServer getDatabaseServer(DbType dbType)
    {
        DatabaseServer dbServer = null;
        
        switch (dbType)
        {
            case ORACLE:
                dbServer = new OracleServer();
                break;
            case SYBASE:
                dbServer = new SybaseServer();
                break;
            case MSSQL:
                dbServer = new MSSQLServer();
                break;
            default:
                break;
        }
        
        return dbServer;
    }
    
    /**
     * <一句话功能简述>根据数据库类型获取url连接字符串 <功能详细描述>
     * 
     * @param dbType 数据库类型
     * @param dbName 数据库名
     * @param ip ip地址
     * @param port 端口号
     * @return url 字符串
     * @see [类、类#方法、类#成员]
     */
    protected String getDbUrlStr(DbType dbType, String dbName, String ip, int port)
    {
        StringBuffer url = new StringBuffer();
        
        if (BaseTools.isNullString(ip))
        {
            ip = "127.0.0.1";
        }
        
        switch (dbType)
        {
            case ORACLE:
                // jdbc:oracle:thin:@localhost:1521:全局数据库名"
                url.append(ORACLE_URL_HEADER);
                url.append(ip);
                url.append(':');
                url.append(port);
                
                if (!BaseTools.isNullString(dbName))
                {
                    url.append(':');
                    url.append(dbName);
                }
                
                break;
            case SYBASE:
                // jdbc:sybase:Tds:ip:port/dbname
                url.append(SYBASE_URL_HEADER);
                url.append(ip);
                url.append(':');
                url.append(port);
                
                if (!BaseTools.isNullString(dbName))
                {
                    url.append(File.separator);
                    url.append(dbName);
                }
                break;
            case MSSQL:
                // jdbc:sqlserver://X0YRQXHHUE52PXC:1433;databaseName=db
                url.append(MSSQL_URL_HEADER);
                url.append(ip);
                url.append(':');
                url.append(port);
                
                if (!BaseTools.isNullString(dbName))
                {
                    url.append(";databaseName=");
                    url.append(dbName);
                }
                break;
            default:
                break;
        }
        
        return url.toString();
    }
}
